#include "Queue.h"
#include "List.h"
// :: 域作用限定符 前面为空则是全局找
#include <iostream>
using  namespace std;//全局展开 默认库 防止命名冲突


int test1()
{
    using  std::cout;//部分展开
    using  std::endl;//只展开cout和endl  其他还是 std::cin

    using  namespace lty;//局部展开
    struct AQueue::Node node1;
    struct BList::Node node2;
    cout << "1234" <<endl;//不展开 == std::cout   endl==\n
    
    int i=0;
    std::cin >> i; //cin自动识别数据类型 
    cout << "i=" << i << endl;
    return 0;
}



void Func(int a=10,int b=20,int c=30)//全缺省
{
    cout << a <<endl;
    cout << b <<endl;
    cout << c <<endl;
}
void Func2(int a,int b=20,int c=30)//半缺省
{
    cout << a <<endl;
    cout << b <<endl;
    cout << c <<endl;
}

int test2()
{
    Func();//缺省参数
    Func(1,2,3);//只能连续使用 不能跳跃使用
    Func(1,2);
    Func(1);
    Func2(100);
    return 0;
}



int add(int a,int b)
{
    return a+b;
}
double add(double a,double b)
{
    return a+b;
}
int test3()//函数重载
{
    //参数个数不同、参数类型顺序不同
    cout << add(1,2) << endl;
    cout << add(1.1,2.2) << endl;
    return 0;
}


void Swap(int& a,int& b)//形参是实参的引用名 地址一样 所以可以交换值
{
    int t=a;a=b;b=t;
}
int test4()//引用
{
    int a=10;
    int& b=a;
    // cout << a << endl << b << endl;
    // cout << &a << endl << &b << endl;//引用==重命名 地址一样
    int x=20;
    int* p=&x;
    int*& pt=p;
    cout << *p << endl << *pt << endl;//指针引用
    cout << p << endl << pt << endl;//地址

    Swap(a,x);  //函数引用
    cout << a << endl << x << endl;
    return 0;
}



#define N 10
typedef struct Array
{
    int a[N];
    int size;    
}AY;

int& PostAt(AY& ay,int i)//PostAt 函数相当于重命名为 ay.a[i]
{
    assert(i<N);
    return ay.a[i];
}
int test5()//引用返回   1、减少拷贝 2、可以修改返回对象
{
    AY ay;
    for (int i=0;i<N;i++)
    {
        PostAt(ay,i)=i;//可修改返回对象
    }
    for (int i=0;i<N;i++)
    {
        cout << PostAt(ay ,i) << " ";
    }
    cout << endl;

    return 0;
}

int test6()
{
    int array[]={8,2,3,4,5,6,7};
    int a=0;
    auto b=a;//自动识别类型
    auto c=&a;
    auto* d=&a;//限定d是指针
    cout <<typeid(b).name() << endl;//类型名输出
    cout <<typeid(c).name() << endl;
    for(auto& i:array)//函数不能用 因为array传过去后是指针 不是数组
    {
        i*=2;//取别名后可以改变数组值
        cout << i << " ";
    }
    cout << endl;
}

int main()
{
    //test1();
    //test2();
    //test3();
    //test4();
    test6();
    return 0;
}